<?php
// +----------------------------------------------------------------------
// | 杭州十禾信息科技有限公司
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2015 http://www.shelpe.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: LeePuman <ysyzlsm@163.com>
// +----------------------------------------------------------------------

class AutoDrive {
	
	/**
	 * 自动开车初始化出价方法2
     * @param array() $word_basic ， 词语基础统计属性数组，即word_basic_props一条记录的结构
     *                         array(  'pv' => 1231 , 
     *                         			'click' => 1231 ....
     *                         			'hprice' => '1212,121,121,21,:121,21' )
	 * @param array() $word_cat_basic
	 * 							array(  'pv' => 1231 , 'click' => 1231 ....)
	 * @param int $maxPrice 关键词的最高出价. 单位为分.
	 * @param string $strategy AutoDriveBaseModel::$PRICE_TYPES的三个值之一
	 * @param float $similarity 关键词跟标题的相似度 [0, 1]
	 * @param bool $considerForcast 考虑forcastrank的api信息来定价
	 * @return int 关键词出价（分），如果为0则没有选中该关键词，应该排除
	 */
	
	public function setPrice1($wordStat, $cateStat, $maxPrice , $strategy , $similarity , $considerForcast = false){
		// thresholds
		$hotWordRatio = 1; // TODO 1) 这个在不同的类目等级中, 需要设定的比例不一样. 2) 分为低, 中, 高 三级
		$hightSim = 0.3;
		$lowSim = 0.1;
		
		//先处理hprice
		$hprice = $wordStat['hprice'];
		$hprice = trim( $hprice ,  '{}');
		$hprice = explode(',' , $hprice);
		$hprice = array_chunk( $hprice , 2 );
		$distribution = array();
		$sum = 0;
		usort( $hprice , 'uc_cmp_hprice');
		foreach($hprice as $h){
			$sum += $h[1];
			$distribution[] = array(
					intval($h[0]) , $sum
			);
		}
		foreach( $distribution as &$d){
			$d[1]  = floatval( $d[1]  / $sum );
		}
		
		/* 热门冷门词区分条件
		 * 前两页总计有38个位置，以此为判断标准，根据分布肉眼统计来看，约有2.3%在前部争抢
		 * 
		 * 具体数据需计算平均更多hprice
		 **/
		
		
		switch($strategy) {
			case AutoDriveBaseModel::$PRICE_TYPES[1] : // 智能平衡
				/* 智能平衡模式考虑 ： 1. 词出到合适价位，按分布来说在0.8左右 ，避免热词过度消耗 ,同时保证长尾词在较好位置 */
				$point = $this->getFirstValueGreatThan( $distribution, 1 , 0.8);
				if(	$point	){
					$price = $point[0];
				}else{
					$price = 0;
				}
										
				break;
			case AutoDriveBaseModel::$PRICE_TYPES[2] : // 引流
				if($wordStat['competition'] > $hotWordRatio * $cateStat['competition']) { // 高竞争
					if($similarity >= $hightSim) {
						$price = 1.2 * $wordStat['avg_price'];
					} else if($similarity >= $lowSim) 	{
						$price = $wordStat['avg_price'];
					} else {
						$price = 0.8 * $wordStat['avg_price'];
					}
				} else {
					if($similarity >= $hightSim) {
						$price = 1.4 * $wordStat['avg_price']; // 保证排名
					} elseif($similarity >= $lowSim) {
						$price = 1.1 * $wordStat['avg_price'];
					} else {
						$price = $wordStat['avg_price'];
					}
				}
				break;
			default : // 小额投资
				if($wordStat['competition'] > $hotWordRatio * $cateStat['competition']) { // 高竞争
					if($similarity >= $hightSim) {
						$price = $wordStat['avg_price'];
					} else if($similarity >= $lowSim) {
						$price = 0.8 * $wordStat['avg_price'];
					}  // else { $price = 0; }
				} else {
					if($similarity >= $hightSim) {
						$price = 1.2 * $wordStat['avg_price']; // 保证排名
					} elseif($similarity >= $lowSim) {
						$price = 1.1 * $wordStat['avg_price'];
					} else {
						$price = $wordStat['avg_price'];
					}
				}
		}
		
		$price = ceil($price);
		return $price > $maxPrice ? $maxPrice :
		($price >= AutoDriveBaseModel::MIN_PRICE ? $price : AutoDriveBaseModel::MIN_PRICE);
	}
	
	/**
	 * 根据开车策略和各项统计数据给关键词出价。
	 *  TODO 也许还可以根据类目下的转化率来计算出价. 转化率越高的词, 出价越高.
	 *  
	 * @param array(k=>v) $wordStat 该词在淘宝全网的表现
	 * @param array(k=>v) $cateStat 类目表现
	 * @param int $maxPrice 关键词的最高出价. 单位为分.
	 * @param string $strategy AutoDriveBaseModel::$PRICE_TYPES的三个值之一
	 * @param float $similarity 关键词跟标题的相似度 [0, 1]
	 * @return int 关键词的出价(分). 如果没有选中该关键词, 返回0.
	 */
	public function setPrice($wordStat, $cateStat, $maxPrice, $strategy, $similarity) {
		// thresholds
		$hotWordRatio = 1; // TODO 1) 这个在不同的类目等级中, 需要设定的比例不一样. 2) 分为低, 中, 高 三级 
		$hightSim = 0.3;
		$lowSim = 0.1;
		
		$price = 0;
		switch($strategy) {
			case AutoDriveBaseModel::$PRICE_TYPES[1] : // 智能平衡
				if($wordStat['competition'] > $hotWordRatio * $cateStat['competition']) { // 高竞争
					if($similarity >= $hightSim) {
						$price = $wordStat['avg_price'];
					} else if($similarity >= $lowSim) {
						$price = 0.9 * $wordStat['avg_price'];
					} // else { $price = 0 }
				} else { // 中低竞争
					if($similarity >= $hightSim) {
						$price = 1.2 * $wordStat['avg_price']; // 最好保证排名
					} elseif($similarity >= $lowSim) {
						$price = $wordStat['avg_price'];
					} else {
						$price = 0.9 * $wordStat['avg_price'];
					}
				}
				break;
			case AutoDriveBaseModel::$PRICE_TYPES[2] : // 引流
				if($wordStat['competition'] > $hotWordRatio * $cateStat['competition']) { // 高竞争
					if($similarity >= $hightSim) {
						$price = 1.2 * $wordStat['avg_price'];
					} else if($similarity >= $lowSim) {
						$price = $wordStat['avg_price'];
					} else { 
						$price = 0.8 * $wordStat['avg_price'];
					}
				} else {
					if($similarity >= $hightSim) {
						$price = 1.4 * $wordStat['avg_price']; // 保证排名
					} elseif($similarity >= $lowSim) {
						$price = 1.1 * $wordStat['avg_price'];
					} else {
						$price = $wordStat['avg_price'];
					}
				}
				break;
			default : // 小额投资
				if($wordStat['competition'] > $hotWordRatio * $cateStat['competition']) { // 高竞争
					if($similarity >= $hightSim) {
						$price = $wordStat['avg_price'];
					} else if($similarity >= $lowSim) {
						$price = 0.8 * $wordStat['avg_price'];
					}  // else { $price = 0; }
				} else {
					if($similarity >= $hightSim) {
						$price = 1.2 * $wordStat['avg_price']; // 保证排名
					} elseif($similarity >= $lowSim) {
						$price = 1.1 * $wordStat['avg_price'];
					} else {
						$price = $wordStat['avg_price'];
					}
				}
		}
		
		$price = ceil($price);
		return $price > $maxPrice ? $maxPrice : 
				($price >= AutoDriveBaseModel::MIN_PRICE ? $price : AutoDriveBaseModel::MIN_PRICE);
	}
	
	/**
	 * 获取一个2D数组中，某个value小于等于$max值的第一个数组
	 * <strong>数组传入后会先按照指定的key进行从小到大的排序</strong>
	 * @param $arr ， 2D数组，如下
	 * 例 array( array(1,0.12) , array(1,0.32) , array(1,0.51) )
	 * @param mixed(int|string) , 比较的数组兼职，可以是数字键值或者是string键值，
	 * 							<strong>必须保证每个数组含有key，否则视为0</strong>
	 * @param mixed $max，设定的值 ，例如0.3
	 * @return array()， 找到的第一个数组 ，找不到的时候返回false
	 *  
	 */
	
	protected function getFirstValueGreatThan($arr , $key , $max){
		foreach($arr as $row){
			if( ! isset( $row[$key] ) ) $row[$key] = 0;
			if( $row[$key] >= $max ){
				return $row;
			}			
		}
		return false;
	}	
	
	
}